fix(deceptive-bytes): align parsed fields and correlation consumers - #2666
Merged
osmontero merged 7 commits intoSep 25, 2026
Merged
Conversation
Data theft, advanced threat tactic and zero-day history searches filter on
{{.origin.ip}} (and tacticName or processName), but their conditions did not
require those fields and this filter never writes origin.ip. A missing
placeholder makes the search return an error, so the first five matching
records would switch each rule off with a Circuit Breaker alert. Require the
placeholder fields in the conditions, as the other seven origin.ip rules of
this source already do, and test that matching events resolve every
placeholder.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
|
Change pushed ( What changed
Why
Validation
Still open: 10 of the 16 rules need |
Brings in go-sdk v1.1.36 for plugins/alerts (field names keep underscores; regexMatch matches strings only) and the coordinated vendor re-baseline. No file overlaps this draft. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-sdk v1.1.36 go-sdk v1.1.35 changed utils.SanitizeField to keep underscores, and v11 now pins v1.1.36, so the KV parser stores Deceptive Bytes keys with their underscores (log.event_type, log.source_ip). The draft had respelled 18 such names in six rules without underscores, as the older SDK stored them; on the latest engine those names never match. Restore the original names in the predicates, history fields and placeholders, and grouping paths. Lateral movement, living off the land, privilege escalation and ransomware are again identical to v11; data theft keeps its origin.ip guard and nation state its "true" comparisons. The committed fixtures now carry all 18 keys, replay.py checks that each is stored with its underscore, and it stages the three rules without history searches. The Go tests build their keys the way the linked SDK stores them. On EventProcessor 8a3ade7: 11 events, 0 parser errors, 3 intended alerts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… and engine Official v11 d2479c1 (go-sdk v1.1.36 in plugins/alerts) and EventProcessor main 8a3ade7, the revision in the newest published engine image. Record the restored underscored names, the history guards, the unchanged parser results and the latest test results: full plugins/alerts suite 48 pass, 11 skip, 0 fail; replay.py 11 events and 3 alerts; go-sdk v1.1.36 rule replay 89 of 89 checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… placeholders exist
The ransomware rule searches history on {{.log.process}} and {{.log.source_ip}}, but its condition did not require those fields. A missing placeholder makes the search fail, and five failures switch the rule off with a Circuit Breaker alert. Require both fields, as the data theft, advanced threat tactic and zero-day rules already require theirs.
The history-guard test now covers the four rules and checks that a rule does not match without any one of the fields it needs; it fails on the unguarded ransomware rule. go-sdk v1.1.36 replay: the unguarded rule matched two lines that each lacked one field, with unresolved placeholders; the guarded rule matches only the line with both (65 of 65 checks). Full plugins/alerts suite: 48 pass, 11 skip, 0 fail; replay.py on EventProcessor 8a3ade7 still passes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… v11 by its guard Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The Deceptive Bytes filter discarded commands at finalization, emitted errors for absent optional KV inputs, and wrote a nonstandard blocked outcome. Several rules also compared KV values with native booleans, although KV stores strings, and four history rules searched on placeholders an event may lack. This draft preserves commands as
origin.command, guards the three optional KV steps, maps explicit blocked/prevented outcomes todenied, and changes seven existing rules. The original vendor action remains available.Five rules use string-boolean comparisons that also accept native
truein go-sdk v1.1.36; the data theft, advanced threat tactic, zero-day and ransomware rules now require the fields their history searches use (origin.ip, andlog.tacticNameorlog.processName; the ransomware rulelog.processandlog.source_ip). Otherwise a missing placeholder fails the search, and five failures switch the rule off with a Circuit Breaker alert. Existing event labels, thresholds, time windows, attribution and severity-letter mappings are retained.Re-validated on the latest versions (2026-09-24): official
v11d2479c1a(merged into this branch, no conflicts;plugins/alertsnow pins go-sdk v1.1.36) and EventProcessormain8a3ade7, the same source revision as the newest published engine image (eventprocessor:v11.2.14), compiled natively here. Since go-sdk v1.1.35 the field-name sanitizer keeps underscores, so KV stores the vendor's own keys (log.event_type,log.source_ip). An earlier revision of this draft respelled 18 such names in six rules without underscores, as the older SDK stored them; on the latest engine those names never match, so this revision restores the original names. Lateral movement, living off the land and privilege escalation are again identical tov11; ransomware differs fromv11only by its placeholder guard.Validation (EventProcessor
8a3ade7, go-sdk v1.1.36):origin.ipand synthetic events for the boolean rules: each rule matched only its intended case, every history placeholder resolved on those matches, and the respelled names matched nothing (89/89 checks). With the ransomware guard, two copies of the ransomware line that each lack one placeholder field no longer match (65/65 checks); the unguarded rule matched both with unresolved placeholders.plugins/alertsGo suite on go-sdk v1.1.36: 48 pass, 11 skip (other technologies' private-evidence tests, same as the base), 0 fail, also after the ransomware guard. All 16 source rules compile; boolean compatibility controls cover strings, native booleans and negative types.Evidence limits: source discovery found no retained Deceptive Bytes documents in 29 successful queries; two discovery attempts failed. These corrections are grounded in SDK/wiki and public parser behavior, not claimed as customer-log validation. The tested EventProcessor commit is
8a3ade72bd9d12db21f6b273200588fb49540f14, with go-sdk v1.1.36 in the playground and every plugin, the version this module pins; it is not asserted to match a customer deployment. Actual vendor event populations, deployed extraction, history, grouping and notifications remain unverified. The source audit documents these limits and reproduction commands.Replaces closed #2592 with raw-input extraction and executable rule-alert checks addressing its review feedback. Draft against v11 for team review; no deployment or merge is requested.
Hosted CI: the architecture, bugs and security review jobs in run 35892985326 all stop before review at
ai-review.sh:29becauseTHREATWINDS_API_KEY is required. All three job logs were checked. Prompt discovery passed; Go dependency checking was still running. This infrastructure failure is separate from the passing local tests and is not a completed AI review.🤖 Generated with Claude Code